--FPGA开发板共阴数码管译码器
--201841052073 叶佳豪
----------------------------------------------
-- Digitron_Out[0] PIN_D9	字码段A
-- Digitron_Out[1] PIN_E10	字码段B
-- Digitron_Out[2] PIN_E8	字码段C
-- Digitron_Out[3] PIN_D11	字码段D
-- Digitron_Out[4] PIN_C8	字码段E
-- Digitron_Out[5] PIN_D8	字码段F
-- Digitron_Out[6] PIN_E9	字码段G
-- Digitron_Out[7] PIN_C9	字码段DP
-- DigitronCS_Out[0] PIN_C14	片选信号DigCS1 
-- DigitronCS_Out[1] PIN_ D14	片选信号DigCS2
-- DigitronCS_Out[2] PIN_ G11 	片选信号DigCS3
-- DigitronCS_Out[3] PIN_ F11 	片选信号DigCS4
-- DigitronCS_Out[4] PIN_ C11 	片选信号DigCS5
-- DigitronCS_Out[5] PIN_ D12 	片选信号DigCS6
----------------------------------------------
--**************引入库********************
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--**************声明实体区*****************
ENTITY KFB_BCD2SEG_6SCAN IS									
	PORT(		
				CLK		:IN std_logic;							--时钟信号
				RST		:IN std_logic;							--复位信号
				SEGDATA0:IN std_logic_vector(3 downto 0);		--数码管0的数据
				SEGDATA1:IN std_logic_vector(3 downto 0);		--数码管1的数据
				SEGDATA2:IN std_logic_vector(3 downto 0);		--数码管2的数据
				SEGDATA3:IN std_logic_vector(3 downto 0);		--数码管3的数据
				SEGDATA4:IN std_logic_vector(3 downto 0);		--数码管4的数据
				SEGDATA5:IN std_logic_vector(3 downto 0);		--数码管5的数据
				Digitron_Out:OUT std_logic_vector(6 downto 0);	--段码输出
				DigitronCS_Out:OUT std_logic_vector(5 downto 0)	--片选输出
		);
END KFB_BCD2SEG_6SCAN;
--***************结构体区****************		
ARCHITECTURE RUN OF KFB_BCD2SEG_6SCAN IS
signal DisplayNum :integer := 0;						--当前显示哪一个段
signal DisplayData :std_logic_vector(3 downto 0);		--显示缓冲区
BEGIN
P_SWITCH:				--计时切换线程
	PROCESS(CLK)
	BEGIN
		IF CLK'EVENT AND CLK = '1' THEN
			DisplayNum <= DisplayNum + 1;
			IF DisplayNum > 5 THEN
				DisplayNum<=0;
			END IF;
			CASE DisplayNum IS
			WHEN 0 =>DisplayData<=SEGDATA0;DigitronCS_Out<="011111";--0
			WHEN 1 =>DisplayData<=SEGDATA1;DigitronCS_Out<="101111";--1
			WHEN 2 =>DisplayData<=SEGDATA2;DigitronCS_Out<="110111";--2
			WHEN 3 =>DisplayData<=SEGDATA3;DigitronCS_Out<="111011";--3
			WHEN 4 =>DisplayData<=SEGDATA4;DigitronCS_Out<="111101";--4
			WHEN 5 =>DisplayData<=SEGDATA5;DigitronCS_Out<="111110";--5
			WHEN OTHERS=>NULL;--其他情况不可能
			END CASE;
			IF RST = '1' THEN
				DisplayNum<=0;
				DisplayData<="1100";
				DigitronCS_Out<="011111";
			END IF;
			--DisplayData<="0110";--测试埋点 测试成功2020.8.23
		END IF;
	END PROCESS;
	
P_DISPLAY:				--显示线程
	PROCESS(DisplayData)
	BEGIN
		CASE DisplayData IS
			WHEN "0000"=>Digitron_Out<="0111111";--0
			WHEN "0001"=>Digitron_Out<="0000110";--1
			WHEN "0010"=>Digitron_Out<="1011011";--2
			WHEN "0011"=>Digitron_Out<="1001111";--3
			WHEN "0100"=>Digitron_Out<="1100110";--4
			WHEN "0101"=>Digitron_Out<="1101101";--5
			WHEN "0110"=>Digitron_Out<="1111101";--6
			WHEN "0111"=>Digitron_Out<="0100111";--7
			WHEN "1000"=>Digitron_Out<="1111111";--8
			WHEN "1001"=>Digitron_Out<="1101111";--9
			
			WHEN "1011"=>Digitron_Out<="0000001";--显示中间-
			WHEN "1100"=>Digitron_Out<="0000000";--熄屏
			
			WHEN OTHERS=>Digitron_Out<="0111110";--共阴极无效输出U
		END CASE;
	END PROCESS;
end RUN;
--****************************************